// 导入数据库操作模块
const db = require('../config/database')
// 导入 SQL 查询语句
const userQueries = require('../config/userQueries')
const path = require('path')

// 发布新文章的处理函数
exports.addArticle = (req, res) => {
  if (!req.file || req.file.fieldname !== 'cover_img') return res.cc('文章封面为必填项')
  // 处理文章信息对象
  const articleInfo = {
    // 标题、内容、状态、所属分类ID
    ...req.body,
    // 文章封面在服务端存放路径和文件名
    cover_img: path.join('/uploads', req.file.filename),
    // 文章发布时间
    pub_date: new Date(),
    // 文章作者ID
    author_id: req.user.id
  }
  db.query(userQueries.INSERT_ARTICLE, articleInfo, (err, result) => {
    // SQL 语句执行失败
    if (err) return res.cc(err, 500)
    // SQL 语句执行成功，但影响行数不为 1
    if (result.affectedRows !== 1) return res.cc('发布文章失败', 501)
    // 操作成功
    return res.cc('发布文章成功', 200)
  })
}

// 获取文章的列表数据处理函数
exports.getArticleList = (req, res) => {
  let { pagenum, pagesize, cate_id, state } = req.query

  // 将 pagenum 和 pagesize 转换为整数类型
  pagenum = parseInt(pagenum)
  pagesize = parseInt(pagesize)

  // 构造 SQL 查询语句
  let sql = 'SELECT a.Id, a.title, a.pub_date, a.state, c.name AS cate_name FROM ev_articles AS a INNER JOIN ev_article_cate AS c ON a.cate_id = c.id WHERE a.is_delete = 0'

  // 定义参数数组
  const params = []

  // 根据参数拼接查询条件
  if (cate_id) {
    sql += ' AND a.cate_id = ?'
    params.push(parseInt(cate_id))
  }
  if (state) {
    sql += ' AND a.state = ?'
    params.push(state)
  }

  // 添加分页限制
  const startIndex = (pagenum - 1) * pagesize
  sql += ' ORDER BY a.pub_date DESC LIMIT ?, ?'
  params.push(startIndex, pagesize)

  // 执行查询
  db.query(sql, params, (err, result) => {
    if (err) return res.cc(err, 500)
    return res.send({
      code: 200,
      msg: '获取文章列表数据成功',
      data: result,
      total: result.length
    })
  })
}

// 删除文章处理函数
exports.deleteArticleById = (req, res) => {
  // 根据用户输入的 id 查 ev_articles 表内 is_delete 行内的值是否为 1
  db.query(userQueries.SELECT_ARTICLE_IS_DELETED_STATUS, req.params.id, (err, result) => {
    if (err) return res.cc(err, 500)
    // 文章不存在
    if (result.length === 0) return res.cc('文章不存在', 404)
    // 文章已被标记清除
    if (result[0].is_delete === 1) return res.cc('文章已被删除', 400)
    db.query(userQueries.UPDATE_ARTICLE_BY_IS_DELETE, req.params.id, (err, result) => {
      // SQL 语句执行失败
      if (err) return res.cc(err, 500)
      // 删除失败，文章不存在
      if (result.affectedRows !== 1) return res.cc('删除失败，文章不存在', 501)
      // 删除成功
      return res.cc('删除成功', 200)
    })
  })
}

// 根据 Id 获取文章详情处理函数
exports.getArticleById = (req, res) => {
  db.query(userQueries.SELECT_ARTICLE_BY_ID, req.params.id, (err, result) => {
    // SQL 语句执行失败
    if (err) return res.cc(err, 500)
    // 查无此 ID 对应的数据
    if (result.length === 0) return res.cc('找不到该文章')
    // 查询成功
    return res.send({
      code: 200,
      message: '获取文章成功！',
      data: result[0]
    })
  })
}

// 根据 Id 更新文章信息处理函数
exports.updateArticleById = (req, res) => {
  if (!req.file || req.file.fieldname !== 'cover_img') return res.cc('文章封面为必填项')
  const { Id, title, cate_id, content, cover_img, state } = req.body
  // 构建更新文章信息的对象
  const articleInfo = {
    title,
    cate_id,
    content,
    cover_img: path.join('/uploads', req.file.filename),
    state
  }
  // 执行更新文章信息的操作
  db.query(userQueries.UPDATE_ARTICLE_BY_ID, [articleInfo, Id], (err, result) => {
    // SQL 语句执行失败
    if (err) return res.cc(err, 500)
    // SQL 语句执行成功，但影响行数不为 1
    if (result.affectedRows !== 1) return res.cc('更新文章失败', 501)
    // 操作成功
    res.cc('更新文章成功', 200)
  })
}